package com.gjh.study.algorithm4.evaluate;

import com.gjh.study.myutils.MyStdIn;
import edu.princeton.cs.algs4.Stack;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Evaluate {
    private static final String[] opsStr = {"+", "-", "*", "/", "sqrt"};
    private static final List<String> opsArr = Arrays.asList(opsStr);

    public static void main(String[] args) {
        Stack<String> ops = new Stack<String>();
        Stack<Double> vals = new Stack<Double>();
        while(!MyStdIn.isEmpty()) {
            // 逐个输入表达式的内容
            String s = MyStdIn.readString();
            if (s.equals("(")) {
                // 忽略左括号
            } else if (opsArr.indexOf(s) > -1) {
                ops.push(s);
            } else if (s.equals(")")) {
                // 弹出一个运算符
                String op = ops.pop();
                // 根据不同的运算符弹出剩余的操作数，并进行计算
                double v = OpsFactory.getOpsHandler(op).calculate(vals);
                // 将结果压入操作数栈
                vals.push(v);
            } else {
                // 既非运算符也不是括号，将它作为double值压入栈
                vals.push(Double.parseDouble(s));
            }
        }
        StdOut.println(vals.pop());
    }
}
